package poo.biblioteca.controladores;

import biblioteca.entidades.*;
import biblioteca.excepciones.ExcepcionDeAplicacion;
import biblioteca.modelos.MdlLibros;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JCheckBox;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import poo.biblioteca.utilidades.UtlManejadorImagenes;
import poo.biblioteca.vistas.FrmPrincipal;
import poo.biblioteca.vistas.autores.*;
import poo.biblioteca.vistas.editoriales.DlgModificarEditoriales;
import poo.biblioteca.vistas.editoriales.IfrMnttoEditorial;
import poo.biblioteca.vistas.editoriales.IfrRegistrarEditorial;
import poo.biblioteca.vistas.editoriales.TbmEditorial;
import poo.biblioteca.vistas.generos.DlgModificarGenero;
import poo.biblioteca.vistas.generos.IfrMnttoGenero;
import poo.biblioteca.vistas.generos.IfrRegistrarGenero;
import poo.biblioteca.vistas.generos.TbmGenero;
import poo.biblioteca.vistas.libros.DlgModificarLibro;
import poo.biblioteca.vistas.libros.IfrMnttoLibro;
import poo.biblioteca.vistas.libros.IfrRegistrarEjemplar;
import poo.biblioteca.vistas.libros.IfrRegistrarLibro;

public class CtrLibros {

//<editor-fold defaultstate="collapsed" desc="Atributos">
    private FrmPrincipal principal;
    //Vistas
    //------Genero
    private IfrRegistrarGenero ifrRegistrarGenero;
    private IfrMnttoGenero ifrMnttoGenero;
    private DlgModificarGenero dlgModificarGenero;
    //------Editorial
    private IfrRegistrarEditorial ifrRegistrarEditorial;
    private IfrMnttoEditorial ifrMnttoEditorial;
    private DlgModificarEditoriales dlgModificarEditoriales;
    //------Autores
    private IfrRegistrarAutor ifrRegistrarAutor;
    private IfrMnttoAutor ifrMnttoAutor;
    private DlgModificarAutor dlgModificarAutor;
    //------Libros
    private IfrRegistrarLibro ifrRegistrarLibro;
    private DlgBuscarAutor dlgBuscarAutor;
    private IfrMnttoLibro ifrMnttoLibro;
    private DlgModificarLibro dlgModificarLibro;
    //------Ejemplares
    private IfrRegistrarEjemplar ifrRegistrarEjemplar;
    //Modelos
    private MdlLibros mdlLibros = new MdlLibros();
    //Entidades auxiliares
    private Genero generoSeleccionado = null;
    private Editorial editorialSeleccionada = null;
    private Autor autorSeleccionado = null;
    private ArrayList<Pais> paises = null;
    private File archivoSeleccionado;
    private Libro libroSeleccionado = null;
    private UtlManejadorImagenes utlManejadorImagenes = new UtlManejadorImagenes();
    //</editor-fold>

    public CtrLibros(FrmPrincipal principal) {
        this.principal = principal;
    }

    //<editor-fold defaultstate="collapsed" desc="Generos">
    public void registrarGenero() {
        if (ifrRegistrarGenero != null) {
            return;
        }
        ifrRegistrarGenero = new IfrRegistrarGenero();

        ifrRegistrarGenero.btnOkAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {

                        Genero nuevoGenero = new Genero(-1,
                                ifrRegistrarGenero.getPanel().getNombreGenero());
                        try {
                            mdlLibros.registrarGenero(nuevoGenero);
                            ifrRegistrarGenero.mostrarMensajeInformativo(
                                    "Registro realizado con éxito",
                                    "Registro exitoso");
                            ifrRegistrarGenero.setVisible(false);
                            ifrRegistrarGenero = null;
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrRegistrarGenero.mostrarMensajeError(
                                    ex.getMessage(), "Error de Registro");
                        }
                    }
                });

        ifrRegistrarGenero.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrRegistrarGenero.setVisible(false);
                        ifrRegistrarGenero = null;
                    }
                });

        ifrRegistrarGenero.addInternalFrameListener(new InternalFrameAdapter() {

            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrRegistrarGenero = null;
            }
        });
        principal.addComponenteADesktop(ifrRegistrarGenero);
        ifrRegistrarGenero.setVisible(true);
    }

    public void mantenimientoGenero() {
        if (ifrMnttoGenero != null) {
            return;
        }
        ifrMnttoGenero = new IfrMnttoGenero();

        ifrMnttoGenero.btnBuscarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ArrayList<Genero> coincidencias = null;
                        try {
                            coincidencias = mdlLibros.buscarGeneroPorNombre(
                                    ifrMnttoGenero.getNombreGenero());
                            ifrMnttoGenero.setTableModel(new TbmGenero(coincidencias));
                            ifrMnttoGenero.permitirEdicion(false);
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoGenero.mostrarMensajeError(ex.getMessage(),
                                    "Error en la búsqueda de Géneros");
                        }
                    }
                });

        ifrMnttoGenero.btnEliminarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            generoSeleccionado =
                                    ifrMnttoGenero.getGeneroSeleccionado();
                            if (ifrMnttoGenero.confirmarEliminacion()) {
                                mdlLibros.eliminarGenero(generoSeleccionado);
                                ifrMnttoGenero.eliminarGeneroSeleccionado();
                                ifrMnttoGenero.mostrarMensajeInformativo(
                                        "Se eliminó el Género exitosamente",
                                        "Eliminación exitosa");
                                ifrMnttoGenero.deseleccionarTabla();
                            }
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoGenero.mostrarMensajeError(ex.getMessage(),
                                    "Error de Aplicación");
                        }
                    }
                });

        ifrMnttoGenero.btnModificarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        generoSeleccionado = ifrMnttoGenero.getGeneroSeleccionado();

                        dlgModificarGenero =
                                new DlgModificarGenero(principal, true);

                        dlgModificarGenero.setIdGenero(generoSeleccionado.getIdGenero());

                        dlgModificarGenero.btnCancelarAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        dlgModificarGenero.setVisible(false);
                                        dlgModificarGenero = null;
                                    }
                                });


                        dlgModificarGenero.btnOkAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        if (ifrMnttoGenero.confirmarModificacion()) {
                                            try {

                                                generoSeleccionado.setNombreGenero(
                                                        dlgModificarGenero.getNombreGenero());

                                                mdlLibros.modificarGenero(generoSeleccionado);

                                                ifrMnttoGenero.mostrarMensajeInformativo(
                                                        "Se modificó el Género exitosamente",
                                                        "Modificación exitosa");

                                                ifrMnttoGenero.modificarGeneroSeleccionado(
                                                        generoSeleccionado.getNombreGenero());

                                                dlgModificarGenero.setVisible(false);
                                                dlgModificarGenero = null;
                                                ifrMnttoGenero.deseleccionarTabla();
                                            } catch (ExcepcionDeAplicacion ex) {
                                                dlgModificarGenero.mostrarMensajeError(ex.getMessage(),
                                                        "Error de Aplicación");
                                            }
                                        }
                                    }
                                });

                        dlgModificarGenero.setLocationRelativeTo(ifrMnttoGenero);

                        dlgModificarGenero.setVisible(true);


                    }
                });

        ifrMnttoGenero.tblGenerosAddMouseListener(
                new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        super.mouseClicked(e);

                        if (ifrMnttoGenero.getFilaSeleccionada() >= 0) {
                            ifrMnttoGenero.permitirEdicion(true);
                        } else {
                            ifrMnttoGenero.permitirEdicion(false);
                        }
                    }
                });

        ifrMnttoGenero.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrMnttoGenero.setVisible(false);
                        ifrMnttoGenero = null;
                    }
                });

        ifrMnttoGenero.addInternalFrameListener(
                new InternalFrameAdapter() {

                    @Override
                    public void internalFrameClosed(InternalFrameEvent e) {
                        super.internalFrameClosed(e);
                        ifrMnttoGenero = null;
                    }
                });

        principal.addComponenteADesktop(ifrMnttoGenero);

        ifrMnttoGenero.setVisible(true);
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Editoriales">
    public void registrarEditorial() {
        if (ifrRegistrarEditorial != null) {
            return;
        }
        ifrRegistrarEditorial = new IfrRegistrarEditorial();

        if (paises == null) {
            try {
                paises = mdlLibros.listarPaises();

            } catch (ExcepcionDeAplicacion ex) {
                ifrRegistrarEditorial.mostrarMensajeError(
                        ex.getMessage(), "Error de Aplicación");
            }
        }
        ifrRegistrarEditorial.getPanel().addPaises(paises);

        ifrRegistrarEditorial.btnOkAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        Editorial nuevaEditorial = new Editorial(
                                -1,
                                ifrRegistrarEditorial.getPanel().getNombreEditorial(),
                                ifrRegistrarEditorial.getPanel().getPaisSeleccionado());
                        try {
                            mdlLibros.registrarEditorial(nuevaEditorial);
                            ifrRegistrarEditorial.mostrarMensajeInformativo(
                                    "Registro realizado con éxito",
                                    "Registro exitoso");
                            ifrRegistrarEditorial.setVisible(false);
                            ifrRegistrarEditorial = null;
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrRegistrarEditorial.mostrarMensajeError(
                                    ex.getMessage(), "Error de Registro");
                        }
                    }
                });

        ifrRegistrarEditorial.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrRegistrarEditorial.setVisible(false);
                        ifrRegistrarEditorial = null;
                    }
                });


        ifrRegistrarEditorial.addInternalFrameListener(new InternalFrameAdapter() {

            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrRegistrarEditorial = null;
            }
        });
        principal.addComponenteADesktop(ifrRegistrarEditorial);

        ifrRegistrarEditorial.setVisible(true);
    }

    public void mantenimientoEditorial() {
        if (ifrMnttoEditorial != null) {
            return;
        }
        ifrMnttoEditorial = new IfrMnttoEditorial();

        ifrMnttoEditorial.btnBuscarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ArrayList<Editorial> coincidencias = null;
                        try {
                            coincidencias = mdlLibros.buscarEditorialPorNombre(
                                    ifrMnttoEditorial.getNombreEditorial());
                            ifrMnttoEditorial.setTableModel(new TbmEditorial(coincidencias));
                            ifrMnttoEditorial.permitirEdicion(false);
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoEditorial.mostrarMensajeError(ex.getMessage(),
                                    "Error en la búsqueda de Géneros");
                        }
                    }
                });

        ifrMnttoEditorial.btnEliminarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            editorialSeleccionada =
                                    ifrMnttoEditorial.getEditorialSeleccionada();
                            if (ifrMnttoEditorial.confirmarEliminacion()) {
                                mdlLibros.eliminarEditorial(editorialSeleccionada);
                                ifrMnttoEditorial.eliminarEditorialSeleccionada();
                                ifrMnttoEditorial.mostrarMensajeInformativo(
                                        "Se eliminó la Editorial exitosamente",
                                        "Eliminación exitosa");
                                ifrMnttoEditorial.deseleccionarTabla();
                            }
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoEditorial.mostrarMensajeError(ex.getMessage(),
                                    "Error de Aplicación");
                        }
                    }
                });

        ifrMnttoEditorial.btnModificarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        editorialSeleccionada = ifrMnttoEditorial.getEditorialSeleccionada();

                        dlgModificarEditoriales =
                                new DlgModificarEditoriales(principal, true);

                        if (paises == null) {
                            try {
                                paises = mdlLibros.listarPaises();

                            } catch (ExcepcionDeAplicacion ex) {
                                ifrMnttoEditorial.mostrarMensajeError(
                                        ex.getMessage(), "Error de Aplicación");
                            }
                        }

                        dlgModificarEditoriales.setIdEditorial(editorialSeleccionada.getIdEditorial());
                        dlgModificarEditoriales.setNombreEditorial(editorialSeleccionada.getNombreEditorial());


                        dlgModificarEditoriales.setPaisSeleccionado(
                                editorialSeleccionada.getPais());

                        dlgModificarEditoriales.getPanel().addPaises(paises);

                        dlgModificarEditoriales.btnCancelarAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        dlgModificarEditoriales.setVisible(false);
                                        dlgModificarEditoriales = null;
                                    }
                                });


                        dlgModificarEditoriales.btnOkAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        if (ifrMnttoEditorial.confirmarModificacion()) {
                                            try {

                                                editorialSeleccionada.setNombreEditorial(
                                                        dlgModificarEditoriales.getNombreEditorial());

                                                editorialSeleccionada.setPais(
                                                        dlgModificarEditoriales.getPais());

                                                mdlLibros.modificarEditorial(editorialSeleccionada);

                                                ifrMnttoEditorial.mostrarMensajeInformativo(
                                                        "Se modificó la Editorial exitosamente",
                                                        "Modificación exitosa");

                                                ifrMnttoEditorial.modificarEditorialSeleccionada(
                                                        editorialSeleccionada);

                                                dlgModificarEditoriales.setVisible(false);
                                                dlgModificarEditoriales = null;
                                                ifrMnttoEditorial.deseleccionarTabla();
                                            } catch (ExcepcionDeAplicacion ex) {
                                                dlgModificarEditoriales.mostrarMensajeError(ex.getMessage(),
                                                        "Error de Aplicación");
                                            }
                                        }
                                    }
                                });

                        dlgModificarEditoriales.setLocationRelativeTo(ifrMnttoEditorial);

                        dlgModificarEditoriales.setVisible(true);


                    }
                });

        ifrMnttoEditorial.tblEditorialesAddMouseListener(
                new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        super.mouseClicked(e);

                        if (ifrMnttoEditorial.getFilaSeleccionada() >= 0) {
                            ifrMnttoEditorial.permitirEdicion(true);
                        } else {
                            ifrMnttoEditorial.permitirEdicion(false);
                        }
                    }
                });

        ifrMnttoEditorial.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrMnttoEditorial.setVisible(false);
                        ifrMnttoEditorial = null;
                    }
                });

        ifrMnttoEditorial.addInternalFrameListener(
                new InternalFrameAdapter() {

                    @Override
                    public void internalFrameClosed(InternalFrameEvent e) {
                        super.internalFrameClosed(e);
                        ifrMnttoEditorial = null;
                    }
                });

        principal.addComponenteADesktop(ifrMnttoEditorial);

        ifrMnttoEditorial.setVisible(true);
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Autores">
    public void registrarAutor() {

        if (ifrRegistrarAutor != null) {
            return;
        }
        ifrRegistrarAutor = new IfrRegistrarAutor();

        if (paises == null) {
            try {
                paises = mdlLibros.listarPaises();

            } catch (ExcepcionDeAplicacion ex) {
                ifrRegistrarAutor.mostrarMensajeError(
                        ex.getMessage(), "Error de Aplicación");
            }
        }
        ifrRegistrarAutor.getPanel().addPaises(paises);

        ifrRegistrarAutor.btnOkAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        Autor nuevoAutor = new Autor(
                                -1,
                                ifrRegistrarAutor.getPanel().getNombreAutor(),
                                ifrRegistrarAutor.getPanel().getApellidoAutor(),
                                ifrRegistrarAutor.getPanel().getPaisSeleccionado());
                        try {
                            mdlLibros.registrarAutor(nuevoAutor);
                            ifrRegistrarAutor.mostrarMensajeInformativo(
                                    "Registro realizado con éxito",
                                    "Registro exitoso");
                            ifrRegistrarAutor.setVisible(false);
                            ifrRegistrarAutor = null;
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrRegistrarAutor.mostrarMensajeError(
                                    ex.getMessage(), "Error de Registro");
                        }
                    }
                });

        ifrRegistrarAutor.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrRegistrarAutor.setVisible(false);
                        ifrRegistrarAutor = null;
                    }
                });


        ifrRegistrarAutor.addInternalFrameListener(new InternalFrameAdapter() {

            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrRegistrarAutor = null;
            }
        });
        principal.addComponenteADesktop(ifrRegistrarAutor);

        ifrRegistrarAutor.setVisible(true);
    }

    public void mantenimientoAutor() {
        if (ifrMnttoAutor != null) {
            return;
        }
        ifrMnttoAutor = new IfrMnttoAutor();

        ifrMnttoAutor.checkBoxesAddActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JCheckBox chkbox = ((JCheckBox) e.getSource());
                if (chkbox.getText().contains("Nombre") && chkbox.isSelected()) {
                    ifrMnttoAutor.activarTxtNombre(true);
                } else if (chkbox.getText().contains("Nombre") && !chkbox.isSelected()) {
                    ifrMnttoAutor.activarTxtNombre(false);
                } else if (chkbox.getText().contains("Apellido") && chkbox.isSelected()) {
                    ifrMnttoAutor.activarTxtApellido(true);
                } else {
                    ifrMnttoAutor.activarTxtApellido(false);
                }

            }
        });

        ifrMnttoAutor.btnBuscarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ArrayList<Autor> coincidencias = null;
                        try {
                            coincidencias = mdlLibros.buscarAutorPorNombreYApellido(
                                    (ifrMnttoAutor.estaSeleccionadoCheckBoxBuscarPorNombre()
                                    ? ifrMnttoAutor.getNombreAutor() : ""),
                                    (ifrMnttoAutor.estaSeleccionadoCheckBoxBuscarPorApellido()
                                    ? ifrMnttoAutor.getApellidoAutor() : ""));

                            ifrMnttoAutor.setTableModel(new TbmAutor(coincidencias));
                            ifrMnttoAutor.permitirEdicion(false);
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoAutor.mostrarMensajeError(ex.getMessage(),
                                    "Error en la búsqueda de Autores");
                        }
                    }
                });

        ifrMnttoAutor.btnEliminarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            autorSeleccionado =
                                    ifrMnttoAutor.getAutorSeleccionado();
                            if (ifrMnttoAutor.confirmarEliminacion()) {
                                mdlLibros.eliminarAutor(autorSeleccionado);
                                ifrMnttoAutor.eliminarAutorSeleccionado();
                                ifrMnttoAutor.mostrarMensajeInformativo(
                                        "Se eliminó el Autor exitosamente",
                                        "Eliminación exitosa");
                                ifrMnttoAutor.deseleccionarTabla();
                            }
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoAutor.mostrarMensajeError(ex.getMessage(),
                                    "Error de Aplicación");
                        }
                    }
                });

        ifrMnttoAutor.btnModificarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        autorSeleccionado = ifrMnttoAutor.getAutorSeleccionado();

                        dlgModificarAutor =
                                new DlgModificarAutor(principal, true);

                        if (paises == null) {
                            try {
                                paises = mdlLibros.listarPaises();

                            } catch (ExcepcionDeAplicacion ex) {
                                ifrMnttoAutor.mostrarMensajeError(
                                        ex.getMessage(), "Error de Aplicación");
                            }
                        }

                        dlgModificarAutor.getPanel().addPaises(paises);

                        dlgModificarAutor.getPanel().setIdAutor(
                                Integer.toString(autorSeleccionado.getIdAutor()));

                        dlgModificarAutor.getPanel().setNombreAutor(
                                autorSeleccionado.getNombreAutor());

                        dlgModificarAutor.getPanel().setApellidoAutor(
                                autorSeleccionado.getApellidoAutor());

                        dlgModificarAutor.getPanel().setPaisSeleccionado(
                                autorSeleccionado.getPais());



                        dlgModificarAutor.btnCancelarAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        dlgModificarAutor.setVisible(false);
                                        dlgModificarAutor = null;
                                    }
                                });


                        dlgModificarAutor.btnOkAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        if (ifrMnttoAutor.confirmarModificacion()) {
                                            try {

                                                autorSeleccionado.setNombreAutor(
                                                        dlgModificarAutor.getPanel().getNombreAutor());

                                                autorSeleccionado.setApellidoAutor(
                                                        dlgModificarAutor.getPanel().getApellidoAutor());

                                                autorSeleccionado.setPais(
                                                        dlgModificarAutor.getPanel().getPaisSeleccionado());

                                                mdlLibros.modificarAutor(autorSeleccionado);

                                                ifrMnttoAutor.mostrarMensajeInformativo(
                                                        "Se modificó el Autor exitosamente",
                                                        "Modificación exitosa");

                                                ifrMnttoAutor.modificarAutorSeleccionado(
                                                        autorSeleccionado);

                                                dlgModificarAutor.setVisible(false);
                                                dlgModificarAutor = null;
                                                ifrMnttoAutor.deseleccionarTabla();
                                            } catch (ExcepcionDeAplicacion ex) {
                                                dlgModificarAutor.mostrarMensajeError(ex.getMessage(),
                                                        "Error de Aplicación");
                                            }
                                        }
                                    }
                                });

                        dlgModificarAutor.setLocationRelativeTo(ifrMnttoAutor);

                        dlgModificarAutor.setVisible(true);


                    }
                });

        ifrMnttoAutor.tblAutorAddMouseListener(
                new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        super.mouseClicked(e);

                        if (ifrMnttoAutor.getFilaSeleccionada() >= 0) {
                            ifrMnttoAutor.permitirEdicion(true);
                        } else {
                            ifrMnttoAutor.permitirEdicion(false);
                        }
                    }
                });

        ifrMnttoAutor.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrMnttoAutor.setVisible(false);
                        ifrMnttoAutor = null;
                    }
                });

        ifrMnttoAutor.addInternalFrameListener(
                new InternalFrameAdapter() {

                    @Override
                    public void internalFrameClosed(InternalFrameEvent e) {
                        super.internalFrameClosed(e);
                        ifrMnttoAutor = null;
                    }
                });

        principal.addComponenteADesktop(ifrMnttoAutor);

        ifrMnttoAutor.setVisible(true);
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Libro">
    public void registrarLibro() {
        if (ifrRegistrarLibro != null) {
            return;
        }
        ifrRegistrarLibro = new IfrRegistrarLibro();

        ifrRegistrarLibro.getPanel().lstAutoresAddListSelectionListener(
                new ListSelectionListener() {

                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (e.getValueIsAdjusting() == false) {

                            if (ifrRegistrarLibro.getPanel().getIndiceAutorSeleccionado() == -1) {

                                ifrRegistrarLibro.getPanel().habilitarEliminarAutor(false);

                            } else {

                                ifrRegistrarLibro.getPanel().habilitarEliminarAutor(true);
                            }
                        }

                    }
                });

        ifrRegistrarLibro.getPanel().btnEliminarAutorAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrRegistrarLibro.getPanel().eliminarAutorSeleccionado();
                    }
                });

        ifrRegistrarLibro.getPanel().setModeloListaAutores(new LsmAutor());
        try {
            ifrRegistrarLibro.getPanel().setEditoriales(mdlLibros.buscarEditorialPorNombre(""));
        } catch (ExcepcionDeAplicacion ex) {
            ifrRegistrarLibro.mostrarMensajeError("No se pudo leer la lista de Editoriales", "Error de lectura");
        }
        try {
            ifrRegistrarLibro.getPanel().setGeneros(mdlLibros.buscarGeneroPorNombre(""));
        } catch (ExcepcionDeAplicacion ex) {
            ifrRegistrarLibro.mostrarMensajeError("No se pudo leer la lista de Géneros", "Error de lectura");
        }

        ifrRegistrarLibro.getPanel().btnBuscarPortadaAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        archivoSeleccionado = ifrRegistrarLibro.getPanel().mostrarDialogoBusquedaDePortada();
                        if (archivoSeleccionado != null) {
                            try {
                                ifrRegistrarLibro.setPortada(
                                        utlManejadorImagenes.generarIconoPreservandoMedidasDeLabel(
                                        ifrRegistrarLibro.getLabelPortada(), archivoSeleccionado));
                            } catch (ExcepcionDeAplicacion ex) {
                                ifrRegistrarLibro.mostrarMensajeError(ex.getMessage(), "Error de lectura de Archivo");
                            }
                        }
                    }
                });

        ifrRegistrarLibro.getPanel().btnAgregarAutorAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        dlgBuscarAutor = new DlgBuscarAutor(principal, true);


                        dlgBuscarAutor.btnBuscarAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        ArrayList<Autor> coincidencias = null;
                                        try {
                                            coincidencias = mdlLibros.buscarAutorPorNombreYApellido(
                                                    (dlgBuscarAutor.estaSeleccionadoCheckBoxBuscarPorNombre()
                                                    ? dlgBuscarAutor.getNombreAutor() : ""),
                                                    (dlgBuscarAutor.estaSeleccionadoCheckBoxBuscarPorApellido()
                                                    ? dlgBuscarAutor.getApellidoAutor() : ""));

                                            dlgBuscarAutor.setTableModel(new TbmAutor(coincidencias));

                                        } catch (ExcepcionDeAplicacion ex) {
                                            dlgBuscarAutor.mostrarMensajeError(ex.getMessage(),
                                                    "Error en la búsqueda de Autores");
                                        }
                                    }
                                });

                        dlgBuscarAutor.tblResultadosAddMouseListener(
                                new MouseAdapter() {

                                    @Override
                                    public void mouseClicked(MouseEvent e) {
                                        super.mouseClicked(e);
                                        if (e.getClickCount() == 2) {
                                            ifrRegistrarLibro.agregarAutorALista(
                                                    dlgBuscarAutor.getAutorSeleccionado());
                                            dlgBuscarAutor.setVisible(false);
                                            dlgBuscarAutor = null;
                                        }
                                    }
                                });
                        dlgBuscarAutor.setLocationRelativeTo(ifrRegistrarLibro);
                        dlgBuscarAutor.setVisible(true);
                    }
                });


        ifrRegistrarLibro.btnOkAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        Libro nuevoLibro = new Libro(
                                -1,
                                ifrRegistrarLibro.getPanel().getISBN(),
                                ifrRegistrarLibro.getPanel().getTitulo(),
                                Integer.parseInt(ifrRegistrarLibro.getPanel().getEdicion()),
                                ifrRegistrarLibro.getPanel().getEditorial(),
                                ifrRegistrarLibro.getPanel().getGenero(),
                                ifrRegistrarLibro.getPanel().getAutores(),
                                ifrRegistrarLibro.getPanel().getArchivoSeleccionado());
                        try {
                            mdlLibros.registrarLibro(nuevoLibro);
                            ifrRegistrarLibro.mostrarMensajeInformativo(
                                    "Registro realizado con éxito",
                                    "Registro exitoso");
                            ifrRegistrarLibro.setVisible(false);
                            ifrRegistrarLibro = null;
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrRegistrarLibro.mostrarMensajeError(
                                    ex.getMessage(), "Error de Registro");
                        }
                    }
                });

        ifrRegistrarLibro.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrRegistrarLibro.setVisible(false);
                        ifrRegistrarLibro = null;
                    }
                });


        ifrRegistrarLibro.addInternalFrameListener(new InternalFrameAdapter() {

            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrRegistrarLibro = null;
            }
        });
        principal.addComponenteADesktop(ifrRegistrarLibro);

        ifrRegistrarLibro.setVisible(true);
    }

    public void mantenimientoLibro() {
        if (ifrMnttoLibro != null) {
            return;
        }
        ifrMnttoLibro = new IfrMnttoLibro();
        try {
            ifrMnttoLibro.setEditoriales(mdlLibros.buscarEditorialPorNombre(""));
        } catch (ExcepcionDeAplicacion ex) {
            ifrMnttoLibro.mostrarMensajeError("No se pudo leer las Editoriales existentes",
                    "Error de Aplicación");
            return;
        }
        try {
            ifrMnttoLibro.setGeneros(mdlLibros.buscarGeneroPorNombre(""));
        } catch (ExcepcionDeAplicacion ex) {
            ifrMnttoLibro.mostrarMensajeError("No se pudo leer los Géneros existentes",
                    "Error de Aplicación");
            return;
        }

        ifrMnttoLibro.btnBuscarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {

                        String isbn, titulo;
                        Editorial editorial;
                        Genero genero;

                        isbn = ifrMnttoLibro.getISBN();
                        titulo = ifrMnttoLibro.getTitulo();
                        editorial = ifrMnttoLibro.getEditorial();
                        genero = ifrMnttoLibro.getGenero();

                        if (isbn == null && titulo == null && editorial == null
                                && genero == null) {
                            return;
                        }

                        try {
                            ArrayList<Libro> libros = null;
                            libros = mdlLibros.buscarLibro(isbn,
                                    titulo,
                                    editorial,
                                    genero);
                            ifrMnttoLibro.setResultadoBusqueda(libros);
                            ifrMnttoLibro.permitirEdicion(false);
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoLibro.mostrarMensajeError(ex.getMessage(), "Error de aplicación");
                            ifrMnttoLibro.setVisible(false);
                            ifrMnttoLibro = null;
                        }



                    }
                });

        ifrMnttoLibro.btnModificarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        libroSeleccionado =
                                ifrMnttoLibro.getLibroSeleccionado();
                        if (libroSeleccionado == null) {
                            return;
                        }

                        dlgModificarLibro = new DlgModificarLibro(principal, true);


                        try {
                            dlgModificarLibro.getPanel().setGeneros(mdlLibros.buscarGeneroPorNombre(""));
                            dlgModificarLibro.getPanel().setEditoriales(mdlLibros.buscarEditorialPorNombre(""));


                        } catch (ExcepcionDeAplicacion ex) {
                            //TODO: Modificar esto
                            Logger.getLogger(CtrLibros.class.getName()).log(Level.SEVERE, null, ex);
                        }

                        dlgModificarLibro.getPanel().setIdLibro(Integer.toString(libroSeleccionado.getIdLibro()));
                        dlgModificarLibro.getPanel().setISBN(libroSeleccionado.getIsbn());
                        dlgModificarLibro.getPanel().setTitulo(libroSeleccionado.getTitulo());
                        dlgModificarLibro.getPanel().setEdicion(Integer.toString(libroSeleccionado.getEdicion()));
                        dlgModificarLibro.getPanel().setGenero(libroSeleccionado.getGenero());
                        dlgModificarLibro.getPanel().setEditorial(libroSeleccionado.getEditorial());

                        dlgModificarLibro.getPanel().setPortada(
                                utlManejadorImagenes.generarIconoPreservandoMedidasDeLabel(
                                dlgModificarLibro.getPanel().getLabelPortada(), libroSeleccionado.getPortada()));
                        dlgModificarLibro.getPanel().setModeloListaAutores(new LsmAutor(libroSeleccionado.getAutores()));

                        dlgModificarLibro.getPanel().lstAutoresAddListSelectionListener(new ListSelectionListener() {

                            @Override
                            public void valueChanged(ListSelectionEvent e) {
                                if (e.getValueIsAdjusting() == false) {

                                    if (dlgModificarLibro.getPanel().getIndiceAutorSeleccionado() == -1) {

                                        dlgModificarLibro.getPanel().habilitarEliminarAutor(false);

                                    } else {

                                        dlgModificarLibro.getPanel().habilitarEliminarAutor(true);
                                    }
                                }

                            }
                        });

                        dlgModificarLibro.getPanel().btnEliminarAutorAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        dlgModificarLibro.getPanel().eliminarAutorSeleccionado();
                                    }
                                });

                        dlgModificarLibro.getPanel().btnBuscarPortadaAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        archivoSeleccionado = dlgModificarLibro.getPanel().mostrarDialogoBusquedaDePortada();
                                        if (archivoSeleccionado != null) {
                                            try {
                                                dlgModificarLibro.setPortada(
                                                        utlManejadorImagenes.generarIconoPreservandoMedidasDeLabel(
                                                        dlgModificarLibro.getLabelPortada(), archivoSeleccionado));
                                            } catch (ExcepcionDeAplicacion ex) {
                                                dlgModificarLibro.mostrarMensajeError(ex.getMessage(), "Error de lectura de Archivo");
                                            }
                                        }
                                    }
                                });

                        dlgModificarLibro.getPanel().btnAgregarAutorAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        dlgBuscarAutor = new DlgBuscarAutor(principal, true);


                                        dlgBuscarAutor.btnBuscarAddActionListener(
                                                new ActionListener() {

                                                    @Override
                                                    public void actionPerformed(ActionEvent e) {
                                                        ArrayList<Autor> coincidencias = null;
                                                        try {
                                                            coincidencias = mdlLibros.buscarAutorPorNombreYApellido(
                                                                    (dlgBuscarAutor.estaSeleccionadoCheckBoxBuscarPorNombre()
                                                                    ? dlgBuscarAutor.getNombreAutor() : ""),
                                                                    (dlgBuscarAutor.estaSeleccionadoCheckBoxBuscarPorApellido()
                                                                    ? dlgBuscarAutor.getApellidoAutor() : ""));

                                                            dlgBuscarAutor.setTableModel(new TbmAutor(coincidencias));

                                                        } catch (ExcepcionDeAplicacion ex) {
                                                            dlgBuscarAutor.mostrarMensajeError(ex.getMessage(),
                                                                    "Error en la búsqueda de Autores");
                                                        }
                                                    }
                                                });

                                        dlgBuscarAutor.tblResultadosAddMouseListener(
                                                new MouseAdapter() {

                                                    @Override
                                                    public void mouseClicked(MouseEvent e) {
                                                        super.mouseClicked(e);
                                                        if (e.getClickCount() == 2) {
                                                            dlgModificarLibro.agregarAutorALista(
                                                                    dlgBuscarAutor.getAutorSeleccionado());
                                                            dlgBuscarAutor.setVisible(false);
                                                            dlgBuscarAutor = null;
                                                        }
                                                    }
                                                });
                                        dlgBuscarAutor.setLocationRelativeTo(ifrRegistrarLibro);
                                        dlgBuscarAutor.setVisible(true);
                                    }
                                });

                        dlgModificarLibro.btnOkAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        Libro nuevoLibro = new Libro(
                                                Integer.parseInt(dlgModificarLibro.getPanel().getIdLibro()),
                                                dlgModificarLibro.getPanel().getISBN(),
                                                dlgModificarLibro.getPanel().getTitulo(),
                                                Integer.parseInt(dlgModificarLibro.getPanel().getEdicion()),
                                                dlgModificarLibro.getPanel().getEditorial(),
                                                dlgModificarLibro.getPanel().getGenero(),
                                                dlgModificarLibro.getPanel().getAutores(),
                                                dlgModificarLibro.getPanel().getArchivoSeleccionado());
                                        try {
                                            mdlLibros.modificarLibro(nuevoLibro);
                                            dlgModificarLibro.mostrarMensajeInformativo(
                                                    "Actualización realizada con éxito",
                                                    "Actualización exitosa");
                                            dlgModificarLibro.setVisible(false);
                                            dlgModificarLibro = null;
                                            ifrMnttoLibro.setVisible(false);
                                            ifrMnttoLibro = null;
                                        } catch (ExcepcionDeAplicacion ex) {
                                            dlgModificarLibro.mostrarMensajeError(
                                                    ex.getMessage(), "Error de Actualización");
                                        }
                                    }
                                });

                        dlgModificarLibro.btnCancelarAddActionListener(
                                new ActionListener() {

                                    @Override
                                    public void actionPerformed(ActionEvent e) {
                                        dlgModificarLibro.setVisible(false);
                                        dlgModificarLibro = null;
                                    }
                                });

                        dlgModificarLibro.setLocationRelativeTo(ifrMnttoLibro);
                        dlgModificarLibro.setVisible(true);
                    }
                });

        ifrMnttoLibro.btnEliminarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            libroSeleccionado =
                                    ifrMnttoLibro.getLibroSeleccionado();
                            if (ifrMnttoLibro.confirmarEliminacion()) {
                                mdlLibros.eliminarLibro(libroSeleccionado);
                                ifrMnttoLibro.eliminarLibroSeleccionado();
                                ifrMnttoLibro.mostrarMensajeInformativo(
                                        "Se eliminó el Libro exitosamente",
                                        "Eliminación exitosa");
                                ifrMnttoLibro.deseleccionarTabla();
                            }
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrMnttoLibro.mostrarMensajeError(ex.getMessage(),
                                    "Error de Aplicación");
                        }
                    }
                });


        ifrMnttoLibro.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrMnttoLibro.setVisible(false);
                        ifrMnttoLibro = null;
                    }
                });

        ifrMnttoLibro.tblLibroAddMouseListener(
                new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        super.mouseClicked(e);

                        if (ifrMnttoLibro.getFilaSeleccionada() >= 0) {
                            ifrMnttoLibro.permitirEdicion(true);
                        } else {
                            ifrMnttoLibro.permitirEdicion(false);
                        }
                    }
                });


        ifrMnttoLibro.addInternalFrameListener(new InternalFrameAdapter() {

            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrMnttoLibro = null;
            }
        });

        principal.addComponenteADesktop(ifrMnttoLibro);
        ifrMnttoLibro.setVisible(true);
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Ejemplares">
    public void registrarEjemplar() {
        if (ifrRegistrarEjemplar != null) {
            return;
        }
        ifrRegistrarEjemplar = new IfrRegistrarEjemplar();
        try {
            ifrRegistrarEjemplar.setEditoriales(mdlLibros.buscarEditorialPorNombre(""));
        } catch (ExcepcionDeAplicacion ex) {
            ifrRegistrarEjemplar.mostrarMensajeError("No se pudo leer las Editoriales existentes",
                    "Error de Aplicación");
            return;
        }
        try {
            ifrRegistrarEjemplar.setGeneros(mdlLibros.buscarGeneroPorNombre(""));
        } catch (ExcepcionDeAplicacion ex) {
            ifrRegistrarEjemplar.mostrarMensajeError("No se pudo leer los Géneros existentes",
                    "Error de Aplicación");
            return;
        }

        ifrRegistrarEjemplar.btnBuscarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {

                        String isbn, titulo;
                        Editorial editorial;
                        Genero genero;

                        isbn = ifrRegistrarEjemplar.getISBN();
                        titulo = ifrRegistrarEjemplar.getTitulo();
                        editorial = ifrRegistrarEjemplar.getEditorial();
                        genero = ifrRegistrarEjemplar.getGenero();

                        if (isbn == null && titulo == null && editorial == null
                                && genero == null) {
                            return;
                        }
                        try {
                            ifrRegistrarEjemplar.setResultadoBusqueda(
                                    mdlLibros.buscarLibro(isbn,
                                    titulo,
                                    editorial,
                                    genero));
                            ifrRegistrarEjemplar.permitirEdicion(false);
                        } catch (ExcepcionDeAplicacion ex) {
                            ifrRegistrarEjemplar.mostrarMensajeError(ex.getMessage(), "Error de Aplicación");
                            ifrRegistrarEjemplar.setVisible(false);
                            ifrRegistrarEjemplar = null;
                        }

                    }
                });

        ifrRegistrarEjemplar.btnRegistrarEjemplarAddActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int idEjemplar = -1;
                if (ifrRegistrarEjemplar.confirmarRegistro() == true) {
                    try {
                        idEjemplar = mdlLibros.registrarEjemplar(ifrRegistrarEjemplar.getLibroSeleccionado());
                        ifrRegistrarEjemplar.mostrarMensajeInformativo("Se registró exitosamente "
                                + "el Ejemplar con el código: " + idEjemplar, "Registro exitoso");
                    } catch (ExcepcionDeAplicacion ex) {
                        ifrRegistrarEjemplar.mostrarMensajeError(ex.getMessage(), "Error de Registro");
                        ifrRegistrarEjemplar.setVisible(false);
                        ifrRegistrarEjemplar = null;
                    }
                }
            }
        });

        ifrRegistrarEjemplar.btnCancelarAddActionListener(
                new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ifrRegistrarEjemplar.setVisible(false);
                        ifrRegistrarEjemplar = null;
                    }
                });

        ifrRegistrarEjemplar.tblLibroAddMouseListener(
                new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        super.mouseClicked(e);

                        if (ifrRegistrarEjemplar.getFilaSeleccionada() >= 0) {
                            ifrRegistrarEjemplar.permitirEdicion(true);
                        } else {
                            ifrRegistrarEjemplar.permitirEdicion(false);
                        }
                    }
                });


        ifrRegistrarEjemplar.addInternalFrameListener(new InternalFrameAdapter() {

            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrRegistrarEjemplar = null;
            }
        });

        principal.addComponenteADesktop(ifrRegistrarEjemplar);
        ifrRegistrarEjemplar.setVisible(true);

    }
    //</editor-fold>
}